﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Media;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Collections;

namespace GameSquares
{
    public partial class FormMain : Form
    {
        Random Rand = new Random(Environment.TickCount);
        public GameProcess NewGame = new GameProcess();
        public string NamePlayer = "Гравець";
        Timer LabelTimer = new Timer();

        public FormMain()
        {         
            InitializeComponent();
            // Виділяємопамять для всіх квадратів
            NewGame.GItems = new GraphItem[Global.NumGraphItems];
            for (int i = 0; i < Global.NumGraphItems; i++)
                NewGame.GItems[i] = new GraphItem(this);
        }

        private void Form_Load(object sender, EventArgs e)
        {
            NewGame.FromFileIni();
            //ініціалізуємо гру розраховуємо комірки
            DrawingOnForm.InitNewGame(NewGame);

            DrawingOnForm.ComputeCellsCoordinate(this, toolStrip1.Height, NewGame.GItems);
            Invalidate();
            ShowRules();
        }
        
        //Правила гри
        private void ShowRules()
        {
            FormRules formRules = new FormRules();
            formRules.TopMost = this.TopMost;
            if (formRules.ShowDialog() == DialogResult.Cancel)
            {
                this.Close();
            }
        }

        //Спливаючі очки
        private void DrawPoints(MouseEventArgs e, int points)
        {           
            LabelTimer.Interval = 1000;
            LabelTimer.Enabled = true;
            label1.Text = points.ToString();
            label1.Location = new Point(e.X, e.Y-15);
            LabelTimer.Tick += new EventHandler(LabelTimer_Tick);
        }

        //Таймер для очок
        private void LabelTimer_Tick(object sender, EventArgs e)
        {
            label1.Text = "";
            LabelTimer.Enabled = false;
        }

        private void Form_MouseClick(object sender, MouseEventArgs e)
        {
            if (NewGame.GameStatus == true)
            {
                NewGame.MouseClick(e);
                Invalidate();
                DrawPoints(e, NewGame.Points);
                IsEndGame();
            }
        }


        #region Кнопки

        //початок гри
        private void StartGame(object sender, EventArgs e)
        {

            NewGame.GameSet.DRH[Global.NumPlayers - 1].CurrentPlayer = true;
            NewGame.GameSet.DRH[Global.NumPlayers - 1].Name = NamePlayer;
            NewGame.GameSet.DRH[Global.NumPlayers - 1].Score = 0;
            NewGame.StartNewGame();
            Invalidate();
        }

        //Кнопка налаштування
        private void toolStripGameSettings_Click(object sender, EventArgs e)
        {

            FormGameSettings fgs = new FormGameSettings(this);
            fgs.TopMost = this.TopMost;
            fgs.CurrentGraphItem = NewGame.GameSet.CurrentGraphItem;
            if (fgs.ShowDialog() == DialogResult.OK)
            {
                // Зберігаємо гру
                NewGame.GameSet.CurrentGraphItem = fgs.CurrentGraphItem;
                // Змінюємо всюди тип фігури
                GraphItem.CurrentTypeGraphItem = NewGame.GameSet.CurrentGraphItem;
                Invalidate();
            }
        }

        //кнопка зміни імені
        private void toolStripChangePlayersName_Click(object sender, EventArgs e)
        {                
            // Змінюємо ім'я 
            FormPlayerName fpn = new FormPlayerName();
            fpn.TopMost = this.TopMost;
            fpn.PlayerName = NamePlayer;
            if (fpn.ShowDialog() == DialogResult.OK)
            {
                NamePlayer = fpn.PlayerName;
                for (int p = 0; p < NewGame.GameSet.DRH.Length; p++)
                {
                    if (NewGame.GameSet.DRH[p].CurrentPlayer == true)
                    {
                        NewGame.GameSet.DRH[p].Name = NamePlayer;
                        break;
                    }
                }
                Invalidate();
            }
        }

        //зміна розміру
        private void Form_Resize(object sender, EventArgs e)
        {
            // Коректні координати при зміні розміру поля
            DrawingOnForm.ComputeCellsCoordinate(this, toolStrip1.Height, NewGame.GItems);
            Invalidate();
        }

        //закриття 
        private void Form_FormClosed(object sender, FormClosedEventArgs e)
        {
            // Серіалізуєм
            NewGame.ToFileIni();
        }

        //режим перегляду
        private void toolStripFullscreen_Click(object sender, EventArgs e)
        {
            // В повноекранний режим
            if (this.TopMost == false)
            {
                this.TopMost = true;
                this.FormBorderStyle = FormBorderStyle.None;
                this.WindowState = FormWindowState.Maximized;
                toolStripButtonFullscreen.Text = "Звичайний режим";
            }
            else
            {
                this.TopMost = false;
                this.WindowState = FormWindowState.Normal;
                this.FormBorderStyle = FormBorderStyle.Sizable;
                toolStripButtonFullscreen.Text = "Повноекранний режим";
            }
        }
        #endregion 

        //Заповнює головну форму
        private void Form_Paint(object sender, PaintEventArgs e)
        {
            //Бічна панель
            Graphics g = e.Graphics;
            DrawingOnForm.PaintSidebar(g, toolStrip1.Height, NewGame);
            for (int i = 0; i < Global.NumGraphItems; i++)
            {
               // NewGame.GItems[i].Draw(g);
                DrawingOnForm.Draw(NewGame.GItems[i], g);
            }
        }

     
        //Гра закінчена (форма)
        bool IsEndGame()
        {         
                if (NewGame.Level.Number != 3)
                {
                    return false;
                }
            
            // Одержуемо к-сть очок поточного гравця
            int score = 0;
            for (int i = 0; i < NewGame.GameSet.DRH.Length; i++)
            {
                if (NewGame.GameSet.DRH[i].CurrentPlayer == true)
                {
                    score = NewGame.GameSet.DRH[i].Score;
                    break;
                }
            }
            FormEndOfGame formEndGame = new FormEndOfGame(score);
            formEndGame.TopMost = this.TopMost;
            if (formEndGame.ShowDialog() == DialogResult.OK)
            {
                StartGame(null, null);
            }
            return true;
        }
    }
}
